package com.lemo.zk;

import java.io.IOException;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;

public class ZK {
	public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
		// 创建一个与服务器的连接

		// 第一个参数：ZooKeeper服务器的连接地址，如果ZooKeeper是集群模式或伪集群模式（即ZooKeeper服务器有多个），那么每个连接地址之间使用英文逗号间隔，单个连接地址的语法格式为“主机IP:ZooKeeper服务器端口号”；
		// 第二个参数：session超时时长（单位：毫秒）
		// 第三个参数：用于监控目录节点数据变化和子目录状态变化的Watcher对象
		ZooKeeper zk = new ZooKeeper("127.0.0.1:4181", 60000, new Watcher() {
			// 监控所有被触发的事件
			// 当对目录节点监控状态打开时，一旦目录节点的状态发生变化，Watcher 对象的 process 方法就会被调用。
			public void process(WatchedEvent event) {
				System.out.println("EVENT:" + event.getType() + "   path:" + event.getPath());

			}
		});

		// 查看根节点
		// 获取指定 path 下的所有子目录节点，同样 getChildren方法也有一个重载方法可以设置特定的 watcher 监控子节点的状态
		// System.out.println("ls / => " + zk.getChildren("/", true));
		// System.out.println("t1是否已经存在："+zk.exists("/t1", true));

		// zk.create("/t2", "RootNodeData".getBytes(), Ids.OPEN_ACL_UNSAFE,
		// CreateMode.PERSISTENT);//创建一个节点名为“/RootNode”的目录节点

		// System.out.println("“/t2”节点状态：" +
		// zk.exists("/t2",true));//判断指定目录节点是否存在

		// System.out.println("“t2”节点上数据："+new String(zk.getData("/t2", false,
		// null)));//获取“RootNode”节点上的数据

		// zk.create("/t2/tt1", "second dir tt1".getBytes(),
		// Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

		// zk.create("/t2/tt2", "second dir tt2".getBytes(),
		// Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

		// System.out.println("t2下的所有子目录: "+zk.getChildren("/t2", false));

		// zk.delete("/t2/tt1", -1); //删除某节点的数据

		// System.out.println("t2下的所有子目录: "+zk.getChildren("/t2", false));

		// 修改某节点的数据
		//zk.setData("/t2/tt2", "update tt2's data".getBytes(), -1);
		//System.out.println("修改后的数据：" + new String(zk.getData("/t2/tt2", false, null)));
		//zk.close();
	}
}
